#include <math.h>

#include "vector3.h"

//Funciones de la clase

Vector3::Vector3():x(0),y(0),z(0)
{
}

Vector3::Vector3(const REAL ax, const REAL ay, const REAL az):x(ax),y(ay),z(az)
{
}

Vector3::Vector3(const Vector3 &v):x(v.x),y(v.y),z(v.z)
{
}

REAL Vector3::getX()const
{
  return x;
}

REAL Vector3::getY()const
{
  return y;
}

REAL Vector3::getZ()const
{
  return z;
}

void Vector3::set(const REAL ax, const REAL ay, const REAL az)
{
  x=ax;
  y=ay;
  z=az;
}

void Vector3::setX(const REAL ax)
{
  x=ax;
}

void Vector3::setY(const REAL ay)
{
  y=ay;
}

void Vector3::setZ(const REAL az)
{
  z=az;
}

REAL Vector3::getModule()const
{
  return sqrt(x*x+y*y+z*z);
}

void Vector3::setModule(const REAL m)
{
  Vector3 aux=*this;
  x=m*(aux.x/aux.getModule());
  y=m*(aux.y/aux.getModule());
  z=m*(aux.z/aux.getModule());
}

Vector3 Vector3::operator+(const Vector3 &v)const
{
  return Vector3(x+v.x,y+v.y,z+v.z);
}

Vector3 Vector3::operator-(const Vector3 &v)const
{
  return Vector3(x-v.x,y-v.y,z-v.z);
}

Vector3 Vector3::operator*(const REAL k)const
{
  return Vector3(x*k,y*k,z*k);
}

bool Vector3::operator==(const Vector3 &v)const
{
  return (x==v.x)&&(y==v.y)&&(z==v.z);
}

bool Vector3::operator!=(const Vector3 &v)const
{
  return (x!=v.x)||(y!=v.y)||(z!=v.z);
}


Vector3 Vector3::operator-()
{
  x = -x;
  y = -y;
  z = -z;
  return *this;
}


void Vector3::print()const
{
  printf("x: %f\ty: %f\tz: %f\n",x,y,z);
}



//Funciones externas

REAL dotProduct(const Vector3 &v, const Vector3 &w)
{
  return (v.getX()*w.getX()+v.getY()*w.getY()+v.getZ()*w.getZ());
}

REAL getAngle(const Vector3 &v, const Vector3 &w)
{
  return acos(dotProduct(v,w)/(v.getModule()*w.getModule()));
}

Vector3 crossProduct(const Vector3 &v, const Vector3 &w)
{
   return Vector3(v.getY()*w.getZ()-v.getZ()*w.getY(), 
        v.getZ()*w.getX()-v.getX()*w.getZ(), 
        v.getX()*w.getY()-v.getY()*w.getX());
}


